package com.java.base.exercise.current.selfcache;

import java.util.HashMap;
import java.util.concurrent.TimeUnit;

/**
 * @Author RenPu
 * @Date 2021/9/20 19:26
 * @Version 1.0
 * @Description: 使用并发编程，编写自定义缓存框架
 **/
public class ImoocCachce {

    // 使用final关键字，来保证hashmap的并发安全，以及不可变类
    private final HashMap<String, Integer> cacheMap = new HashMap<>();


    /**
     * 从缓存框架获取数据
     * 增加synchronized增加并发访问的安全
     * 存在的弊端：
     * 1：性能差。2：复用性差
     *
     * @param userId
     * @return
     * @throws InterruptedException
     */
    public synchronized Integer compter(String userId) throws InterruptedException {
        Integer result = cacheMap.get(userId);

        //先判断缓存是否包含，需要查询的元素
        if (null == result) {
            result = doCompter(userId);
            cacheMap.put(userId, result);
        }
        return result;

    }


    /**
     * 计算方法
     *
     * @param userId
     * @return
     * @throws InterruptedException
     */
    private Integer doCompter(String userId) throws InterruptedException {

        TimeUnit.SECONDS.sleep(5);
        return new Integer(userId);

    }


    public static void main(String[] args) throws InterruptedException {

        ImoocCachce imoocCachce = new ImoocCachce();
        System.out.println("开始计算了！！！！！");
        Integer compter = imoocCachce.compter("13");
        System.out.println("第一次打印的结果" + compter);

        compter = imoocCachce.compter("13");
        System.out.println("第二次打印的结果" + compter);


    }


}
